#pragma once
#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
#include <malloc.h>
//操作算法中用到的预定义的常量和类型
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

//Status是函数的类型，其值是函数结果状态代码
typedef int Status;
typedef char ElemType;

//单链表的存储结构
typedef struct LNode
{
	ElemType data;        //节点的数据域
	struct LNode* next;   //节点的指针域(嵌套定义)
}LNode, * LinkList;       //LinkList为指向结构体LNode的指针类型

//函数声明
LinkList InitList(void);//初始化 - 构造一个空的线性表L
void DestroyList(LinkList L);//销毁
void ClearList(LinkList L);//置空
Status ListEmpty(LinkList L);//判空(若线性表L为空表,则返回TRUE，否则返回FALSE)
Status ListLength(const LinkList L);//返回L中数据元素的个数
ElemType GetElem(const LinkList L, int x, ElemType e);//用e返回L中第i个数据元素的值.(初始条件:线性表已存在,且1 ≤ i ≤ ListLength(L))
Status LocateElem(const LinkList L, ElemType e);//返回L中第1个与e相同的允许在L中的位置。若这样的元素不存在，则返回值为0
ElemType PriorElem(const LinkList L, ElemType cur_e, ElemType* p_pre_e);//若cur_e是L的数据元素,且不是第一个，则用pre_e返回其前驱,否则操作失败,pre_e无定义
ElemType NextElem(const LinkList L, ElemType cur_e, ElemType* p_next_e);//若cur_e是L的数据元素，且不是最后一个，则用next_e返回其后继，否则操作失败，next_e无定义
void ListInsert(LinkList L, int x, ElemType e);//在L中第i个位置之前插入新的数据元素e，L的长度+1
void ListDelete(LinkList L, int x);//删除L的第i个元素，L的长度-1
void TraverseList(const LinkList L);//对线性表L进行遍历，在遍历过程中对L的每个结点访问一次
void SortList(LinkList L);//排序

//创建单链表
void CreateList_H(LinkList L);//头插法(前插法)创建单链表
void CreateList_R(LinkList L);//尾插法(后插法)创建单链表